
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sqlite3.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define N 16
#define M 256
#define R 1
#define L 2
#define S 3
#define H 4
#define D 5
#define C 6
#define DATABASE "my.db"

typedef struct{
	char name[N];
	char sex;
	int  age;
	int num;
}MESG;

typedef struct{
	int type;
	char name[N];
	char data[M];
}MSG;

int do_message(int socketd, MSG *msg)
{
	
	MESG messge;
	char sqlstr[300];
	printf("input sex >>");
	scanf("%s", &messge.sex);
	getchar();

	printf("input age>>>");
	scanf("%d", &messge.age);
	getchar();

	printf("input your num>>>");
	scanf("%d", &messge.num);
	getchar();
	sprintf(sqlstr,"insert into message values('%s', '%s', '%d', '%d')", msg->name, &messge.sex, messge.age, messge.num);
	printf("%s\n",sqlstr);
	send(socketd, sqlstr, sizeof(sqlstr), 0);
	usleep(40);

	recv(socketd, sqlstr, sizeof(sqlstr), 0);
	if(strncmp(sqlstr, "OK", 3) == 0)
	{
		printf("register : %s\n",sqlstr);
		return 0;
	}
	return -1;
}

int do_register(int socketd, MSG *msg)
{
	msg->type = R;
	printf("input your name >>>");
	scanf("%s", msg->name);
	getchar();
	printf("input passwd>>>");
	scanf("%s", msg->data);
	getchar();
	send(socketd, msg, sizeof(MSG), 0);
	recv(socketd, msg, sizeof(MSG), 0);
	if(strncmp(msg->data, "OK", 3) == 0)
	{
		do_message(socketd, msg);
		return 0;
	}
	return -1;
}

int do_delect_usr(int socketd, MSG *msg)
{
	msg->type = D;
	printf("input delete usr name>>>");
	scanf("%s", msg->name);

	send(socketd, msg, sizeof(MSG), 0);


	recv(socketd, msg, sizeof(MSG), 0);
	if(strncmp(msg->data, "OK", 3) == 0)
	{
		printf("delet : %s\n", msg->data);
		return 0;
	}
	return -1;

}

int do_change_usr(int socketd, MSG *msg)
{
	int n;
	char buf[20];
	msg->type = C;
	printf("input change name >>");
	scanf("%s", msg->name);
	printf("input change >>>\n");
	printf("*********************************\n");
	printf("*******1:sex 2:age 3:num*********\n");
	printf("*********************************\n");
	scanf("%d", &n);
	switch(n)
	{
	case 1:
		printf("input new sex >>>");
		scanf("%s", buf);
		sprintf(msg->data, "update message set sex='%s' where name='%s' ", buf, msg->name);
		break;
	case 2:
		printf("input new  age >>>");
		scanf("%d", &n);
		sprintf(msg->data, "update message set  age = %d where name = '%s'", n, msg->name);
		break;
	case 3:
		printf("input new num >>>");
		scanf("%d", &n);
		sprintf(msg->data, "update message set num = %d where  name = '%s'", n, msg->name);
		break;
	}
	printf("1111\n");
	send(socketd, msg, sizeof(MSG), 0);
	printf("2222\n");
	recv(socketd, msg, sizeof(MSG), 0);
	printf("333\n");
	printf("%s", msg->data);
}


int do_search(int socketd, MSG *msg)
{
	msg->type = S;

	printf("input search name >>>");
	scanf("%s", msg->name);
	sprintf(msg->data, "select * from message where name = '%s'", msg->name);
	printf("%s", msg->data);
	send(socketd, msg, sizeof(MSG), 0);
	usleep(40);
	recv(socketd, msg, sizeof(MSG), 0);

	printf("****%s\n", msg->data);
	return 0;
}
int do_change_passwd(int socketd, MSG *msg)
{

	char buf[10] = {0};
	msg->type = H;

	printf("input new passwd >>>");
	scanf("%s", buf);
	getchar();
	printf("%s", buf);
	sprintf(msg->data, "update usr set passwd = '%s' where name = '%s'", buf, msg->name);
	printf("%s", msg->data);
	send(socketd, msg, sizeof(MSG), 0);
	usleep(40);
	recv(socketd, msg, sizeof(MSG), 0);

	printf("%s", msg->data);
}

int do_login(int socketd, MSG *msg)
{
	msg->type = L;
	printf("input your name >>>");
	if(scanf("%s", msg->name) <= 0)
	{
			perror("scanf");
			exit(-1);
	}
	printf("input passwd>>>");
	if(scanf("%s", msg->data) <= 0)
	{
			perror("scanf");
			exit(-1);
	}

	send(socketd, msg, sizeof(MSG), 0);
	usleep(20);
	recv(socketd, msg, sizeof(MSG), 0);
	if(strncmp(msg->data, "OK", 3) == 0)
	{
		printf("login : OK\n");
		if(strncmp(msg->name, "root", 5) == 0)
		{
			return 1;
		}
		else
		{
			return 2;
		}
		
	}
	printf("login ： %s\n", msg->data);
	return 0;
}


int main(int argc, const char *argv[])
{
	int socketd;

	struct sockaddr_in serveraddr;

	MSG msg;
	if(argc < 3){
		printf("ip port input error\n");
		exit(-1);
	}
//创建套接字
	if((socketd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
		perror("fail to socket");
		exit(-1);
	}

	//填充网络结构
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
	serveraddr.sin_port = htons(atoi(argv[2]));
//等待链接服务器
	if(connect(socketd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
	{
		perror("connect error");
		exit(-1);
	}
	int n;
	while(1)
	{
		printf("**************************************\n");
		printf("*************1:login  2:quit**********\n");
		printf("**************************************\n");
		printf("please choose :\n");
		if(scanf("%d", &n) <= 0)
		{
			perror("scanf");
			exit(-1);
		}
		switch(n){
		case 1:
			if(do_login(socketd, &msg) == 1)
			{
				goto root;
			}
			else if(do_login(socketd, &msg) == 0)
			{
				continue;
			}
			else
			{
				goto other;
			}

			break;
		case 2:
			close(socketd);
			exit(0);
		}
	
	}
root:

	while(1)
	{
		printf("***********************************************************\n");
		printf("****1:insert usr 2:delete usr  3:change  4:search 5:quit***\n");
		printf("***********************************************************\n");
		printf("please choose >>>>>");
		if(scanf("%d", &n) <= 0)
		{
			perror("scanf");
			exit(-1);
		}
		switch(n)
		{
			case 1:
				do_register(socketd, &msg);
				break;
			case 2:
				do_delect_usr(socketd, &msg);
				break;
			case 3:
				do_change_usr(socketd, &msg);
			case 4:
				do_search(socketd, &msg);
				break;
			case 5:
				close(socketd);
				exit(0);
		}
	
	}

other:
while(1)
{
		printf("***********************************************************\n");
		printf("**********1:change_passwd  2:search  3:quit****************\n");
		printf("***********************************************************\n");

		printf("input your change>>>");
		scanf("%d", &n);
		switch(n)
		{
		case 1:
			do_change_passwd(socketd, &msg);
			break;
		case 2:
			do_search(socketd, &msg);
			break;
		case 3:
			close(socketd);
			exit(0);
		}

}
	return 0;
}




